package com.smh.demo1.a06;

import com.smh.demo1.common.LogColour;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;

import javax.annotation.PostConstruct;

/**
 * @author shiminghui
 * @date 2025/4/12 10:19
 * @description: TODO
 */
public class Config {
    private static final Logger log = LoggerFactory.getLogger(Config.class);

    @Autowired
    public void setApplicationContext(ApplicationContext applicationContext) {
        log.info(LogColour.BLUE + "setApplicationContext use Autowired :{}" + LogColour.RESET, applicationContext);
    }

    @PostConstruct
    public void init() {
        log.info(LogColour.Blue("init use PostConstruct"));
    }

    // 工厂方法
    // 这里创建一个BeanFactoryPostProcessor,由于beanFactoryPostProcessor要在创建Bean之前执行,所以,这里会提前创建Config(工厂)实例
    // 那么就会导致@autowired和@postConstruct无法执行,因为Config实例的时候,Bean的后处理器还没有加载
    // 顺序为BeanFactoryPostProcessor -> BeanPostProcessor -> Bean实例 -> Bean依赖注入(执行BeanPostProcessor)-> 执行Aware接口方法
    // -> Bean初始化(执行BeanPostProcessor) -> Bean销毁(执行BeanPostProcessor)
    // 解决方法,使用Aware接口,因为Aware接口方法不需要执行BeanPostProcessor,所以,这里就可以使用Aware接口的方法,
    @Bean
    public BeanFactoryPostProcessor beanFactoryPostProcessor() {
        return beanFactory -> {
            log.info(LogColour.Blue("beanFactoryPostProcessor use Bean"));
        };
    }


}
